package com.daohang361.imqq.pugin.encoder;

import static org.apache.commons.codec.digest.DigestUtils.md5;
import com.daohang361.imqq.Asycore.QQUser;
import com.daohang361.imqq.ServerContex.SessionContex;
import com.daohang361.imqq.encoder.AbstractEncoder;
import com.daohang361.imqq.encoder.InterfaceEncoder;
import com.daohang361.imqq.protocol.QQ2011;
import com.daohang361.imqq.tool.ByteArray;
import com.daohang361.imqq.tool.Hex2Bytes;
import com.daohang361.imqq.tool.MyByteSendArray;
import com.daohang361.imqq.tool.MyUtil;

/** 
 * @author naner E-mail:likun3344@163.com 
 * @create time：2011-5-25 下午07:20:49 
 * 第一次
 *66 2B 4F EC[QQ号码：1714114540] 
 *15 C4 41 D0 [QQ号码：365183440]
 *00 00 00 00 
 *21 07 
 *66 2B 4F EC[QQ号码：1714114540] 
 *15 C4 41 D0[QQ号码：365183440]
 *D7 C9 C4 3E 69 7F 64 10 41 35 C8 D5 A4 5F A7 3E [key] md5(目标QQ号码+sessionkey)
 *00 AF 64 1A 
 *4D 9D D9 83 [ 时间：2011/4/7 23:34:27]
 *02 37
 *00 00 00 01
 *后面
 *1B D1 B8 D2 //发送者的QQ号码+0
02 2B F6 11 //接收者的QQ号码+4
00 00 00 08 00 01 00 04 00 00 00 00 // fixed version depended +8
1E 07 //发送者的QQ版本号 +20
1B D1 B8 D2 //发送者的QQ号码+22
02 2B F6 11 //接收者的QQ号码+26
AE F7 0E 44 A8 78 AD 98 01 A2 32 8E 99 3E 0F E9//md5(接收者的QQ号码+ session_key) + 30
00 0B //消息类型. 0x000B for normal text message + 46
4A 0C //序列号 + 48
4D 85 90 6C //发送时间 + 50
00 00 //发送图标 + 54
00 00 00 //fixed + 56
01 //是否带有字体 + 59
01 //分片数 + 60
00 //分片索引 + 61
00 00 //消息id，从0开始 + 62
01 //发送的类型。01 for normal message ; 02 for auto reply message + 64
4D 53 47 00 00 00 00 00 //fixed + 65
4D 85 90 6C //发送时间 + 73
C3 81 99 67 //随机数 + 77
00 //fixed + 81
00 00 00 //字体红绿蓝三个分量值 + 82
09 //字体显示大小 + 85
00 //是否还有其他字体属性 + 86
86 00//字符集; 86 for utf8 + 87
00 06 //字体名称长度 + 89
E5 AE 8B E4 BD 93 //字体名称：宋体（按照字符集的编码） + 91
00 00 01 //fixed + 97
00 26 //total message block size//所有消息块的大小 + 100
01 //the first message block//消息块编号 + 102
00 23 //size of the first message block//消息块大小 + 103
49 20 61 6D 20 69 6E 20 42 31 38 34 30 35 2E E8 // 消息: （按照字符集的编码） + 105
BF 99 E6 98 AF E4 B8 AD E6 96 87 E3 80 82 31 30
30 38 36
 */
public class EncoderCD  extends AbstractEncoder  implements InterfaceEncoder{
	/**
	 * Object[from qq,targer qq ]
	 */
	@Override
	public byte[] encode(QQUser myqq, int c,Object...o) {
		ByteArray myByte = doHead(myqq, "00CD");
		myByte.saveThis();//保存此段作为第0段
		byte[] sendFriendKey=SessionContex.getSendFriendKey( o[0]+""+o[1]+"");
		if(sendFriendKey==null)//首次发送
		{
			myByte.putInt(Integer.parseInt(o[0]+""));
			myByte.putInt(Integer.parseInt(o[1]+""));
		
			myByte.putHex("00 00 00 00 21 07");
		
			myByte.putInt(Integer.parseInt(o[0]+""));
			myByte.putInt(Integer.parseInt(o[1]+""));
	    
			MyByteSendArray mysend=new MyByteSendArray();
			int targQQ=Integer.parseInt(o[1].toString());
			mysend.putHex(MyUtil.intToHex(targQQ));
			mysend.putHex(myqq.getSessionkey());
			mysend.saveThis();
			byte[] tempKey=mysend.getByteList();
			//System.out.println("tempKey Hex:"+Hex2Bytes.bytesToHexString(tempKey));
			//System.out.println("tempKey:"+md5(tempKey));
			myByte.putByte(md5(tempKey));
			SessionContex.saveSendFriendKey(o[0]+""+o[1]+"", md5(tempKey));
			myByte.putHex("00 AF 64 1A");
			myByte.putHex(MyUtil.Get4HexTime());
			myByte.putHex("02 37");
			myByte.putHex("00 00 00 01");
			myByte.saveThis();//保存此段作为第一段
			myByte.teaThis(1, 1,myqq.getAttr("SessionKey"));//加密第一段到第一段
			System.out.println("SessionKey:"+Hex2Bytes.bytesToHexString(myqq.getAttr("SessionKey")));
			doTail(myByte);
		}else{//发送消息内容
		    myByte.putInt(Integer.parseInt(o[0]+""));
		    myByte.putInt(Integer.parseInt(o[1]+""));
			
			myByte.putHex("00 00 00 0D 00 01 00 04 ");
			myByte.putHex("00 00 00 00 00 03 00 01 01 21 07");
			
			myByte.putInt(Integer.parseInt(o[0]+""));
		    myByte.putInt(Integer.parseInt(o[1]+""));
		    
			myByte.putByte(sendFriendKey);
			System.out.println("sendFriendKey:"+Hex2Bytes.bytesToHexString(sendFriendKey));
			myByte.putHex("00 0B ");//发送状态
			myByte.putHex("3D FD ");
			String nowHexTime=MyUtil.Get4HexTime();
			myByte.putHex(nowHexTime);
			myByte.putHex("02 37");
			myByte.putHex("00 00 00 01 01");
			myByte.putHex("00 00 00 01");//是否含有字体熟悉
			myByte.putHex("4D 53 47 00 00 00 00 00 ");
			myByte.putHex(nowHexTime);
			myByte.putHex("51 FE F9 5D 00 00 00 00 09 00 86 00 ");
			myByte.putHex("00 0C");//[字体长度]
			myByte.putHex("E5 BE AE E8 BD AF E9 9B 85 E9 BB 91");//[字体长度]
			byte[] sendContex = o[2].toString().getBytes();
			myByte.putHex("00 00 01");
			myByte.putHex("00");
			myByte.putInt(sendContex.length+3);//
			myByte.putHex("01");
			myByte.putHex("00");//发送长度
			myByte.putInt(sendContex.length);//发送长度
			myByte.putByte(sendContex);
			
			myByte.saveThis();//保存此段作为第一段
			myByte.teaThis(1, 1,myqq.getAttr("SessionKey"));//加密第一段到第一段
			System.out.println("SessionKey:"+Hex2Bytes.bytesToHexString(myqq.getAttr("SessionKey")));
			doTail(myByte);
		}
		return myByte.getByteList();//返回完整的package
	}
	
	private boolean ignore=false;
	@Override
	public byte[] encode(QQUser myqq, int c) {
		System.out.println("使用默认编码器 命令为:"+MyUtil.intTo2Hex(c));
		ByteArray array=doHead(myqq,MyUtil.intTo2Hex(c));
		array.saveThis();//保存此段作为第0段
		array.putByte(myqq.getSend());
		array.saveThis();//保存此段作为第一段
		array.teaThis(1, 1,myqq.getAttr("SessionKey"));//加密第一段到第一段
		array=doTail(array);
		return array.getByteList();
	}

	public ByteArray doHead(QQUser myqq,String HexCommand)
	{
		ByteArray myByte = new MyByteSendArray();
		myByte.putInt(QQ2011.QQ_PROTOCOL_PACKAGE_HEAD);
		myByte.putInt(QQ2011.QQ_PROTOCOL_VERSION);
		myByte.putHex(HexCommand);
		myByte.putInt(myqq.getPakage());//包增长应该在接受到此包后
		myByte.putInt(myqq.getQq());
		myByte.putByte(QQ2011.QQ_CONTEX_FIX_12);
		return myByte;
	}
	public ByteArray doTail(ByteArray myByte)
	{
		myByte.putInt(QQ2011.QQ_PROTOCOL_PACKAGE_TAIL);
		myByte.saveThis();//保存此段作为第二段
		return myByte;//返回完整的package
	}
	
	@Override
	public boolean getIgnore() {
		
		return ignore;
	}
	
	@Override
	public void setIgnore(boolean ignore) {
		this.ignore=ignore;
	}
	@Override
	public Object invoke(Object... o) {
	// TODO Auto-generated method stub
	return null;
	}
	
}
